package com.zp.self.module.level_4_算法练习.脑筋急转弯;

/**
 * @author By ZengPeng
 */
public class 力扣_48_旋转图像 {
    //测试
    public static void main(String[] args) {
       int[][] ints = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
//         int[][] ints = {{5,1,9,11},{2,4,8,10},{13,3,6,7},{15,14,12,16}};
        new 力扣_48_旋转图像().rotate(ints);
        System.out.println(ints.toString());
    }

    /**
    题目：给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
         你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。
        请不要 使用另一个矩阵来旋转图像。

     示例 1：
     输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
     输出：[[7,4,1],[8,5,2],[9,6,3]]

     示例 2：
     输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
     输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]



    分析：
        规律：A.首先是按某个点旋转，所有节点与他的距离一直不变，坐标有规律变化？
              B.外圈的任然在外圈
        难点：A.每个节点的位移，如何使得遍历完整个图形？

       1.坐标从新计算-- 【过于复杂】
       2.抽取，行转列--【但需要开辟同等大小空间，不切合题意】
       大神解答：先转置，后镜像反转

    边界值 & 注意点：
       1.
     **/
    public void rotate(int[][] matrix) {
        //转置： 以 x=y 对称轴置换， matrix[i][j] 与 matrix[n-j][n-i] 互换
        int n = matrix.length-1;
        for (int i = 0; i < n ; i++) {
            for (int j = 0; j < n-i; j++) {
                matrix[i][j] = matrix[i][j] ^ matrix[n-j][n-i];
                matrix[n-j][n-i] = matrix[i][j] ^ matrix[n-j][n-i];
                matrix[i][j] = matrix[i][j] ^ matrix[n-j][n-i];
            }
        }
      /*  //打印
        for (int[] aMatrix : matrix) {
            for (int j = 0; j < matrix.length; j++)
                System.out.print(aMatrix[j] + ",");
            System.out.println();
        }*/
        //镜像反转 以n/2 为对称轴  ，matrix[i][j]  与 matrix[n-i][j] 互换
        for (int i = 0; i < matrix.length/2 ; i++) {
            for (int j = 0; j <= n; j++) {
                matrix[i][j] = matrix[i][j] ^ matrix[n-i][j];
                matrix[n-i][j] = matrix[i][j] ^ matrix[n-i][j];
                matrix[i][j] = matrix[i][j] ^ matrix[n-i][j];
            }
        }
       /* System.out.println("------------");
        //打印
        for (int[] aMatrix : matrix) {
            for (int j = 0; j < matrix.length; j++)
                System.out.print(aMatrix[j] + ",");
            System.out.println();
        }*/
    }
}
